/**
 * ES2017引入async/await
 * 它使得代码看起来像是同步的，但它是异步的并且在后台无阻塞。
 * 因此，通过使用async/await实现异步编程是一种更好的方式
 */
//异步函数返回Promise对象
const AsyncOper = () =>{
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve('成功')
        },1000)
    })
}

//使用async/await对上面代码进行异步回调时，只需要在声明的函数前面加上async关键字
//并在调用的函数前面加上await即可。这里需要注意的是，客户端函数必须被定义为async
//例如，在下面代码中，要异步调用上面定义的AsyncOper函数,首先需要使用async关键字
//定义一个匿名函数，然后再要调用的AsyncOper函数前面加上await关键字
async function runAsync(){
    const data = await AsyncOper()
    console.log(data)
}
runAsync()
//和下面代码等价
const runAsync2 = async () => {
    const data = await AsyncOper()
    console.log(data)
}
runAsync2()

//在任何函数之前加上async关键字，就意味这该函数会返回Promise即使没有显示返回Promise
//第一个函数 ＋async 会返回promise
const Func1 = async () => {
    return '测试'
}
//util.type判断是不是promise
const util = require('util')
console.log(util.types.isPromise(Func1()))
//第一个函数
Func1().then(console.log)
//第二个函数
const Func2 = () => {
    return Promise.resolve('测试')
}
Func2().then(console.log)
//第二个函数等价于第一个函数